package br.edu.catolica.sadbc.core.action;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Context;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;

import br.edu.catolica.sadbc.core.entity.AbstractEntity;

/**
 * Classe abstrat para a camada de visão.
 * 
 * @author robert.resende
 */
@Scope(ScopeType.CONVERSATION)
public abstract class AbstractAction <T extends AbstractEntity> {
	
	public static String RESULT_FAIL = "RESULT_FAIL";
	public static String RESULT_EDIT = "RESULT_EDIT";
	public static String RESULT_BACK = "RESULT_BACK";
	public static String RESULT_DETAIL = "RESULT_DETAIL";
	
	@Logger
	protected Log log;
	
	@In(value="statusMessages")
	protected StatusMessages messages;
	
	/**
	 * Adição de messagem ao StatusMessages.
	 * 
	 * @param severity
	 * @param message
	 */
	protected void addMessage(Severity severity, String message,
			Object... params) {
		messages.add(severity, message, params);
	}

	/**
	 * Adição de messagem de informação no StatusMessages.
	 * 
	 * @param message
	 */
	protected void addMessageInfo(String message, Object... params) {
		addMessage(Severity.INFO, message, params);
	}

	protected void addMessageInfo(String message) {
		addMessage(Severity.INFO, message);
	}

	/**
	 * Adição de messagem de informação no StatusMessages.
	 * 
	 * @param message
	 */
	protected void addMessageWarn(String message, Object... params) {
		addMessage(Severity.WARN, message, params);
	}

	/**
	 * Adição de messagem de informação no StatusMessages.
	 * 
	 * @param message
	 */
	protected void addMessageErro(String message, Object... params) {
		addMessage(Severity.ERROR, message, params);
	}

	protected void addMessageErro(String message) {
		addMessage(Severity.ERROR, message);
	}

	/**
	 * Método que retorna o contexto correspondente ao escopo de solicitação
	 * 
	 * @param type
	 * @return Context
	 */
	protected Context getContexts(ScopeType type) {
		Context ctx = null;
		switch (type) {
		case APPLICATION:
			ctx = Contexts.getApplicationContext();
			break;
		case SESSION:
			ctx = Contexts.getSessionContext();
			break;
		case CONVERSATION:
			ctx = Contexts.getConversationContext();
			break;
		case PAGE:
			ctx = Contexts.getPageContext();
			break;
		case EVENT:
			ctx = Contexts.getEventContext();
			break;
		default:
			break;
		}
		return ctx;
	}

}
